home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Gekkan Dennou Club 145
/
Gekkan Dennou Club - 2000.6 Vol. 145 (Japan).7z
/
Gekkan Dennou Club - 2000.6 Vol. 145 (Japan) (Track 1).bin
/
tools
/
sharp
/
sxwork2.lzh
/
サンプル基礎編
/
ダイアログ
/
DITEM.C
< prev
next >
Wrap
Text File
|
1994-03-10
|
10KB
|
280 lines
/******************************************************************************
* ditem.c: ダイアログの処理関数
******************************************************************************
* Workroom SX-68K Sample Program Copyright 1994 SHARP
*/
#include <console.h> /* コンソール系マネージャを利用するときに必要 */
#include <sxgraph.h> /* グラフ系マネージャを利用するときに必要 */
#include <window.h> /* ウィンドウマンを利用するときに必要 */
#include <control.h> /* コントロールマンを利用するときに必要 */
#include <dialog.h> /* ダイアログマンを利用するときに必要 */
#include <text.h> /* テキストマンを利用するときに必要 */
#include <task.h> /* タスクマンを利用するときに必要 */
#include "ditem.h" /* このプログラム固有のヘッダファイル */
/******************************************************************************
* dialogProc(): ダイアログの作成、表示と各種処理
******************************************************************************
* 引数: ComVal *pcv 共通変数へのポインタ
* = TRUE: 処理完了
* = FALSE: 処理失敗
* 戻り値: int num 終了したダイアログアイテムの番号
* = 1: [設定]ボタン
* = 2: [取消]ボタン
* < 0: 処理失敗
*/
int dialogProc(ComVal *pcv)
{
int num; /* ダイアログのアイテム番号 */
int radBtn; /* ラジオボタンの現在の状態 */
int chkBox; /* チェックボックスの現在の状態 */
int lastBC;
Rect rc;
Handle dIListHdl;
Graph *lastGraph;
Dialog dialog; /* ダイアログレコード */
Dialog *dialogPtr = &dialog; /* ダイアログポインタ(疑似ポインタ)*/
/* ダイアログの表示位置 */
static Rect dlgPos = { DLG_X, DLG_Y, DLG_X + DLG_H, DLG_Y + DLG_V };
static short funcKeyTbl[] = { /* ファンクションキーアサインテーブル */
K_HOME, 0, /* [HOME] */
K_DEL, 0x07, /* [DEL] */
K_RUP, 0x03, /* [ROLL UP] */
K_RDOWN, 0x12, /* [ROLL DOWN] */
K_UNDO, 0, /* [UNDO] */
K_LEFT, 0x13, /* [←] */
K_UP, 0x05, /* [↑] */
K_RIGHT, 0x04, /* [→] */
K_DOWN, 0x18, /* [↓] */
K_CLR, 0, /* [CLR] */
K_HELP, 0, /* [HELP] */
K_INS, 0, /* [INS] */
0, 0 /* テーブル終端 */
};
/* ダイアログアイテムのリソースを読み込む */
dIListHdl = TSRscGet('DITL', 128);
if (dIListHdl == NULL) {
pcv->errorCode = 14; /* 読み込めなかった */
return -1; /* 失敗したので-1を返す */
}
TSAdjustRect(&rc, &dlgPos, 16); /* ダイアログの表示位置を補正する */
dialogPtr = DMOpen( /* ダイアログをオープンする */
dialogPtr, /* 用意したダイアログポインタ */
&rc, /* ダイアログの表示位置 */
NONTITLE, /* タイトルは自分で描画する */
FALSE, /* オープン時に描画しない */
WI_DLG << 4, /* ダイアログウィンドウ */
W_FRONT, /* 一番手前に表示する */
FALSE, /* クローズボタンを使用しない */
LONGWORD(1, TSGetID()), /* 自分のタスクID */
dIListHdl); /* アイテムリストへのハンドル */
if (dialogPtr == NULL) {
pcv->errorCode = 7; /* 作成できなかった */
return -1; /* 失敗したので-1を返す */
}
/* ファンクションキーアサインテーブルを設定する */
(*dialogPtr->tEdit)->funcCode = funcKeyTbl;
/* 編集可能テキストの文字列を設定する */
setDItemText(dialogPtr, 6, pcv->text);
radBtn = pcv->radBtn; /* ラジオボタンの現在の状態を取得する */
/* 選択されているラジオボタンに1をセットする */
setDItemControl(dialogPtr, radBtn + 3, 1);
/* チェックボックスの現在の状態を取得する */
chkBox = pcv->chkBox;
if (chkBox == 1) /* チェック状態か? */
/* チェックボックスに1をセットする */
setDItemControl(dialogPtr, 5, 1);
WMShow(&dialogPtr->window); /* ダイアログを表示する */
/* ダイアログをカレントグラフにする */
lastGraph = GMExgGraph(&dialogPtr->window.graph);
/* タイトルを描画する */
GMShadowStrZ("ダイアログアイテム", LONGWORD((DLG_H - 9 * 12) / 2, 4));
GMShadowStrZ("ラジオボタン", LONGWORD(30, 39));
GMShadowStrZ("チェックボックス", LONGWORD(50, 73));
GMShadowStrZ("文字ボタン", LONGWORD(60, 145));
lastBC = GMBackColor(G_WHITE); /* バックグラウンドカラーを白にする */
DMDraw(dialogPtr); /* すべてのアイテムを描画する */
while (1) {
/* 帰還属性を持つアイテムが押されるまで、アイテムの各種処理を
システムに任せて、押されたアイテムの番号を取得する */
num = DMControl(filterProc);
switch (num) {
case 1: /* [設定]ボタン */
case 2: /* [取消]ボタン */
break;
case 3: /* ラジオボタン */
case 4:
radBtn = num - 3;
/* 押されたラジオボタンに1をセットする */
setDItemControl(dialogPtr, num, 1);
/* 押されていないラジオボタンに0をセットする */
setDItemControl(dialogPtr, 7 - num, 0);
break;
case 5: /* チェックボックス */
/* チェックボックスの現在値を得て反転する */
chkBox = getDItemControl(dialogPtr, num) ^ 1;
setDItemControl(dialogPtr, num, chkBox);
break;
}
if (num == 1) {
/* [設定]ボタンが押されたなら、ラジオボタンとチェック
ボックスの状態、編集可能テキストの内容を保存する */
pcv->radBtn = radBtn;
pcv->chkBox = chkBox;
/* 編集可能テキストの文字列を取得する */
getDItemText(dialogPtr, 6, pcv->text);
break;
} else if (num == 2)
break;
}
GMBackColor(lastBC); /* バックグラウンドカラーを元に戻す */
DMClose(dialogPtr); /* ダイアログをクローズする */
GMSetGraph(lastGraph); /* カレントグラフを元に戻す */
/* 処理が完了したのでアイテム番号を返す */
return num;
}
/******************************************************************************
* filterProc(): ダイアログのフィルタ関数
******************************************************************************
* 引数: Dialog *dlgPtr ダイアログポインタ
* Event *pev イベントレコードへのポインタ
* 戻り値: int 終了コード(ここでは、常に0)
* 注釈:
* DMControl()から呼び出され、カーソルの点滅処理と、リターンキー/ESCキー
* の入力を[設定]/[取消]ボタンのマウス左ダウンイベントに変換する処理を行う。
*/
int filterProc(Dialog *dlgPtr, Event *pev)
{
int keyCode; /* キーコード */
int num = 0; /* ダイアログのアイテム番号 */
short type;
Rect rc;
Handle item;
/* ダイアログをカレントグラフにする */
GMSetGraph(&dlgPtr->window.graph);
switch (pev->what) { /* イベントの種類は? */
case E_IDLE: /* アイドルイベント */
TMIdle(dlgPtr->tEdit); /* カーソルを点滅させる */
break;
case E_KEYDOWN: /* キーダウンイベント */
/* キーコードをファンクションキーアサインテーブルで変換する */
keyCode = TMKeyToAsk(dlgPtr->tEdit, (TsEvent *) pev);
/* キーコードがあるか? */
if (keyCode != -1 && keyCode != 0) {
switch (pev->whom.key.ascii) {
case '\r': /* リターンキーかENTERキー */
num = 1; /* [設定]ボタン */
break;
case '\x1b': /* ESCキー */
num = 2; /* [取消]ボタン */
break;
}
if (num != 0) {
/* 指定アイテムのレクタングル内を指す座標を
作成する */
DIGet(dlgPtr, num, &type, &item, &rc);
/* 縦横4ドットだけ内側へ移動する */
rc.d.left += 4;
rc.d.top += 4;
/* グローバル座標系に変換する */
pev->where.x_y = GMLocalToGlobal(rc.l.l_t);
/* イベントをマウス左ダウンイベントにする */
pev->what = E_MSLDOWN;
}
}
break;
case E_UPDATE: /* アップデートイベント */
/* カーソルを点滅させるために、アップデート処理を行う */
WMUpdate(&dlgPtr->window); /* アップデートを開始する */
WMUpdtOver(&dlgPtr->window); /* アップデートを終了する */
break;
}
return 0;
}
/******************************************************************************
* setDItemControl(): ダイアログアイテムのコントロールへの値の設定
******************************************************************************
* 引数: Dialog *dlgPtr ダイアログポインタ
* int num ダイアログのアイテム番号
* int val 設定する値
*/
void setDItemControl(Dialog *dlgPtr, int num, int val)
{
short type;
Rect rc;
Handle item;
/* ダイアログアイテムのハンドルを取得する */
DIGet(dlgPtr, num, &type, &item, &rc);
/* コントロールに値を設定する */
CMValueSet((Control **) item, val);
}
/******************************************************************************
* getDItemControl(): ダイアログアイテムのコントロールの現在値の取得
******************************************************************************
* 引数: Dialog *dlgPtr ダイアログポインタ
* int num ダイアログのアイテム番号
* int *val 値を格納するポインタ
*/
int getDItemControl(Dialog *dlgPtr, int num)
{
short type;
Rect rc;
Handle item;
/* ダイアログアイテムのハンドルを取得する */
DIGet(dlgPtr, num, &type, &item, &rc);
/* コントロールの現在値を返す */
return CMValueGet((Control **) item);
}
/******************************************************************************
* setDItemText(): ダイアログアイテムの編集可能テキストへの文字列の設定
******************************************************************************
* 引数: Dialog *dlgPtr ダイアログポインタ
* int num ダイアログのアイテム番号
* _LASCII str 設定するLASCII型文字列
*/
void setDItemText(Dialog *dlgPtr, int num, _LASCII str)
{
short type;
Rect rc;
Handle item;
/* ダイアログアイテムのハンドルを取得する */
DIGet(dlgPtr, num, &type, &item, &rc);
DITSet(type, item, str); /* 編集可能テキストに文字列を設定する */
}
/******************************************************************************
* getDItemText(): ダイアログアイテムの編集可能テキストの文字列の取得
******************************************************************************
* 引数: Dialog *dlgPtr ダイアログポインタ
* int num ダイアログのアイテム番号
* _LASCII str LASCII型文字列を格納するポインタ
*/
void getDItemText(Dialog *dlgPtr, int num, _LASCII str)
{
short type;
Rect rc;
Handle item;
/* ダイアログアイテムのハンドルを取得する */
DIGet(dlgPtr, num, &type, &item, &rc);
DITGet(type, item, str); /* 編集可能テキストの文字列を取得する */
str[str[0] + 1] = 0; /* 文字列の最後に0を付加する */
}